使用变形 (Morph) 资源
使用变形 (Morph) 资源可以通过无缝迁移在变形目标之间变形。Kanzi 使用着色器实现变形。请参阅着色器。
在能够在 Kanzi 中的网格之间进行变形之前,您需要在第三方工具中创建 3D 模型并将它们导入到 Kanzi Studio 中。
当在第三方工具中创建网格以便在它们之间进行变形时,请首先创建基础网格,然后从这种网格类型创建要变形到的网格。当创建网格时,请记住:
- 所有网格必须都具有相同数量的顶点和组合仪表。
- 请勿更改网格的拓扑。
对网格变形
要对网格变形:
- 在资产 (Assets) 中点击导入资产 (Import Assets) 并导入 3D 模型,其使用的变形网格具有您要在其间变形的变形目标。
Kanzi Studio 将 3D 模型导入到工程后,它将:- 在素材库 (Library) > 网格 (Meshes) 中添加来自 3D 模型的网格和一个使用导入网格的变形 (Morph) 资源。
- 在预设件 (Prefabs) 中添加场景 (Scene) 预设件,其包含使用 变形 (Morph) 和 网格 (Mesh) 资源的 Model 节点。
Kanzi Studio 设置导入的模型 (Model) 节点的材质 (Material) 属性,这些节点将变形 (Morph) 资源用到支持变形的材质。
例如,导入一个 3D 模型,其中包含一个名为 Morph_Warning_Start 的变形以及网格 Warning_Start 和 Warning_Ready。
- 在预设件 (Prefabs) 中复制使用变形 (Morph) 资源的模型 (Model) 节点,并在工程 (Project) 中将其粘贴到您要添加变形的节点。
例如,在预设件 (Prefabs) 中复制Warning_Start 节点并在工程 (Project) 中将其粘贴到场景 (Scene) 节点。
- 在属性 (Properties) 中的变形目标权重 (Morph Target Weights) 属性中调整变形 (Morph) 资源中每个网格 (Mesh) 项的权重,以控制变形 (Morph) 的形状。
值越高,变形 (Morph) 越接近该网格的形状。当您将变形目标权重 (Morph Target Weights) 之和保持为 1,最终形状的缩放与目标形状一致。
例如,可以使用关键帧动画来更改变形的形状。请参阅动画化变形。
为变形 (Morph) 添加网格
向变形 (Morph) 添加网格以添加形状,在它们之间进行变形。为使变形正常运行,请只添加从同一个基础网格塑造的具有相同拓扑以及相同顶点和组合仪表数量的网格。
要为变形 (Morph) 添加网格:
- 在素材库 (Library) > 网格 (Meshes) 中,创建或选择一个变形 (Morph)。
例如,选择 Morph_Warning_Start。
- 在变形目标权重 (Morph Target Weights) 属性中的 中:
- 点击添加 (Add) 并从下拉菜单中选择要添加到 变形 (Morph) 的网格。
- 调整网格的权重。
值越高,变形 (Morph) 越接近该网格的形状。当您将变形目标权重 (Morph Target Weights) 之和保持为 1,最终形状的缩放与目标形状一致。
动画化变形
使用关键帧动画可以更改变形的形状。
要动画化变形:
- 在素材库 (Library) 中按下 Alt 并右键点击动画 (Animations) 并创建一个动画剪辑 (Animation Clip)。
例如,将其命名为 Morph Animation Clip。
您需要使用动画剪辑 (Animation Clip) 为变形中的网格托管关键帧动画。每个动画都以变形中的特定网格为目标,并定义了不同时间点的网格的权重。
- 在素材库 (Library) > 动画 (Animations) 中,选择您在上一步中创建的动画剪辑,并为要变形的第一个网格创建一个关键帧动画。
例如,将动画命名为 Start Animation 并在属性 (Properties) 中将:- 目标属性 (Target Property) 设置为 <Expression>,然后点击 以添加变形权重 (Morph Weight) 属性并将其设置为 <MorphWeight>[0]
- 属性特性 (Property Attribute) 为整体属性 (Whole property)
- 根据变形 (Morph) 中要动画化的网格的数量,将上一步重复任意次,并为 <MorphWeight>[n] 中的每个动画将 n 设置为变形 (Morph) 中要使用动画更改其权重的那个网格。
例如,要使用三个网格对变形进行动画化,请创建另外两个动画并将它们命名为 Middle Animation 和Ready Animation,并设置:- Middle Animation 目标属性 (Target Property) 为 <Expression> <MorphWeight>[1]
- Ready Animation 目标属性 (Target Property) 为 <Expression> <MorphWeight>[2]
您需要使用Middle Animation 设置变形中的第二个网格的权重,并使用Ready Animation 设置变形中的第三个网格在另一个时间点的权重。
- 为您在上一步骤中创建的动画创建关键帧。请参阅为目标属性特性创建关键帧动画。
您需要使用关键帧值设置变形中的网格在另一个时间点的权重 (Weight) 属性。值越高,变形 (Morph) 越接近该网格的形状。当您将变形目标权重 (Morph Target Weights) 之和保持为 1,最终形状的缩放与目标形状一致。
例如,要使用三个网格为变形创建一秒钟的线性动画,请使用以下关键帧:- Start Animation:
- 第一个关键帧:
- 时间 (Time) 为 0
- 值 (Value) 为 1
- 第二个关键帧:
- 时间 (Time) 为 0.5
- 值 (Value) 为 0
- Middle Animation:
- 第一个关键帧:
- 时间 (Time) 为 0
- 值 (Value) 为 0
- 第二个关键帧:
- 时间 (Time) 为 0.5
- 值 (Value) 为 1
- 第三个关键帧:
- 时间 (Time) 为 1
- 值 (Value) 为 0
- Ready Animation:
- 第一个关键帧:
- 时间 (Time) 为 0.5
- 值 (Value) 为 0
- 第二个关键帧:
- 时间 (Time) 为 1
- 值 (Value) 为 1
- 使用您创建的关键帧动画对变形进行动画化:
- 在工程 (Project) 中,选择模型 (Model) 节点,其网格 (Mesh) 属性已设置为您要动画化的 变形 (Morph)。请参阅对网格变形。
- 在节点组件 (Node Components) > 动画 (Animation) 区域中点击+ 添加动画 (+ Add Animation) 并选择动画播放器 (Animation Player)。
- 在您创建的动画播放器 (Animation Player) 中的节点组件 (Node Components) 中,将目标动画时间线 (Target Animation Timeline) 属性设置为您在第一步中创建的动画剪辑 (Animation Clip),然后设置动画回放。请参阅播放关键帧动画。
例如,设置:- 自动播放已启用 (Autoplay Enabled) 为启用
- 回放模式 (Playback Mode) 为往复 (Ping pong)
- 重复计数 (Repeat Count)无限 (Infinite) 为启用
在 API 中使用变形
要手动创建变形时间线并为时间线时钟创建回放:
// 创建变形并为其添加网格(之前创建)。
MorphSharedPtr morph = Morph::create(domain, "testMorph");
morph->add(mesh1, 0.0f);
morph->add(mesh2, 1.0f);
// 添加保持变形的节点,然后将其添加到场景图(场景)中。
Model3DSharedPtr model = Model3D::create(domain, "testSphere");
model->setMesh(morph);
scene->addChild(model);
// 创建浮点动画并添加两个关键帧。
FloatKeyframeAnimationSharedPtr animation = FloatKeyframeAnimation::create(domain);
animation->addLinearKeyframe(chrono::milliseconds(0), 0.0f);
animation->addLinearKeyframe(chrono::milliseconds(100), 1.0f);
// 创建时间线和回放。
MorphWeightTimelineSharedPtr morphTimeline = MorphWeightTimeline::create(domain, "testSphere", 0, animation);
SceneGraphTimelinePlaybackContext context(*scene);
TimelinePlaybackSharedPtr playback = morphTimeline->createPlayback(context);
// 添加回放到根时钟
domain->getRootTimelineClock()->addTimelinePlayback(playback);
有关详细信息,请参阅 API reference中的 Morph
类。
另请参阅
3D 资产
导入 3D 资产
在第三方工具中准备 3D 资产
使用网格
网格最佳实践
材质类型和材质
使用材质类型
动画
为目标属性特性创建关键帧动画
播放关键帧动画
编辑着色器
属性优先级
打开导航